package com.woniuxy.user.service;

import redis.clients.jedis.exceptions.JedisConnectionException;

import java.util.List;

/**
 * @Author:阳佳
 * @Date: 2020/7/23 16:03
 * @Description:
 * 方法一 ：lrem 表示移除缓存中已存在的课件  保证用户在观看统一课件时 不会重复记录
 * 方法二： lpush 向缓存中插入最新浏览的商品
 * 方法三： lTrim 能保证缓存中最多有多少记录
 * 方法四： expire 为某个key设置过期时间
 * 方法五： lrange 分页获取缓存记录
 * 方法六：llen  保存的list长度
 *
 * @PACKAGE_NAME:com.woniuxy.user.service
 */
public interface RedisService {
    /**
     * 根据参数 count 的值，移除列表中与参数 value 相等的元素。
     * <p>
     * count 的值可以是以下几种：
     * <p>
     * count > 0 : 从表头开始向表尾搜索，移除与 value 相等的元素，数量为 count 。
     * count < 0 : 从表尾开始向表头搜索，移除与 value 相等的元素，数量为 count 的绝对值。
     * count = 0 : 移除表中所有与 value 相等的值。
     * 返回值：
     * 被移除元素的数量。
     * 因为不存在的 key 被视作空表(empty list)，所以当 key 不存在时， LREM 命令总是返回 0 。
     */
    public Long lrem(String key, long count, String value);

    /**
     * Add the string value to the head (LPUSH) or tail (RPUSH) of the list
     * stored at key. If the key does not exist an empty list is created just
     * before the append operation. If the key exists but is not a List an error
     * is returned.
     * <p>
     * Time complexity: O(1)
     *
     * @param key
     * @param string
     * @return Integer reply, specifically, the number of elements inside the
     * list after the push operation.
     */
    public Long lpush(final String key, final String string);

    /**
     * LTRIM操作
     * <p>
     * 对一个列表进行修剪(trim)，就是说，让列表只保留指定区间内的元素，不在指定区间之内的元素都将被删除。
     * <p>
     * 举个例子，执行命令 LTRIM list 0 2 ，表示只保留列表 list 的前三个元素，其余元素全部删除。
     * <p>
     * 下标(index)参数 start 和 stop 都以 0 为底，也就是说，以 0 表示列表的第一个元素，以 1 表示列表的第二个元素，以此类推。
     * <p>
     * 你也可以使用负数下标，以 -1 表示列表的最后一个元素， -2 表示列表的倒数第二个元素，以此类推。
     * <p>
     * 当 key 不是列表类型时，返回一个错误。
     */

    String lTrim(String key, final long start, final long end);


    /**
     * 设置一个键的相对过期时间,O(1)
     *
     * @param key     键
     * @param seconds 过期秒数
     * @return true 设置成功,false 设置失败
     * @throws JedisConnectionException 若和redis服务器的连接不成功
     */
    boolean expire(String key, int seconds);

    /**
     * Return the specified elements of the list stored at the specified key.
     * Start and end are zero-based indexes. 0 is the first element of the list
     * (the list head), 1 the next element and so on.
     * <p>
     * For example LRANGE foobar 0 2 will return the first three elements of the
     * list.
     * <p>
     * start and end can also be negative numbers indicating offsets from the
     * end of the list. For example -1 is the last element of the list, -2 the
     * penultimate element and so on.
     * <p>
     * <b>Consistency with range functions in various programming languages</b>
     * <p>
     * Note that if you have a list of numbers from 0 to 100, LRANGE 0 10 will
     * return 11 elements, that is, rightmost item is included. This may or may
     * not be consistent with behavior of range-related functions in your
     * programming language of choice (think Ruby's Range.new, Array#slice or
     * Python's range() function).
     * <p>
     * LRANGE behavior is consistent with one of Tcl.
     * <p>
     * <b>Out-of-range indexes</b>
     * <p>
     * Indexes out of range will not produce an error: if start is over the end
     * of the list, or start > end, an empty list is returned. If end is over
     * the end of the list Redis will threat it just like the last element of
     * the list.
     * <p>
     * Time complexity: O(start+n) (with n being the length of the range and
     * start being the start offset)
     *
     * @param key
     * @param start
     * @param end
     * @return Multi bulk reply, specifically a list of elements in the
     * specified range.
     */
    public List<String> lrange(String key, final long start, final long end);

    /**
     * Return the length of the list stored at the specified key. If the key
     * does not exist zero is returned (the same behaviour as for empty lists).
     * If the value stored at key is not a list an error is returned.
     * <p>
     * Time complexity: O(1)
     *
     * @param key
     * @return The length of the list.
     */
    public long llen(String key);


}
